Disclaimer: The purpose of the Open Case Studies project is to demonstrate the use of various data science methods, tools, and software in the context of messy, real-world data. A given case study does not cover all aspects of the research process, is not claiming to be the most appropriate way to analyze a given data set, and should not be used in the context of making policy decisions without external consultation from scientific experts.
This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 (CC BY-NC 3.0) United States License.
Motivation
Main Questions
Our main question:
- Question 1
- Question 2 etc.
Learning Objectives
In this case study, we will explore CO2 emission data from around the world. We will also focus on the US specifically to evaluate patterns of temperatures and natural disaster activity.
This case study will particularly focus on how to use different datasets that span different ranges of time, as well as how to create visualizations of patterns over time. We will especially focus on using packages and functions from the tidyverse, such as dplyr, tidyr, and ggplot2.
The tidyverse is a library of packages created by RStudio. While some students may be familiar with previous R programming packages, these packages make data science in R especially legible and intuitive.
The skills, methods, and concepts that students will be familiar with by the end of this case study are:
Data Science Learning Objectives:
- Importing data from various types of Excel files and CSV files
- Apply action verbs in
dplyr for data wrangling
- How to pivot between “long” and “wide” datasets
- Joining together multiple datasets using
dplyr
- How to create effective longitudinal data visualizations with
ggplot2
- How to add text, color, and labels to
ggplot2 plots
- How to create faceted
ggplot2 plots
Statistical Learning Objectives:
- Introduction to correlation coefficient as a summary statistic
- Relationship between correlation and linear regression
- Correlation is not causation

We will begin by loading the packages that we will need:
library(here)
library(readr)
library(dplyr)
| here |
to easily load and save data |
| readr |
to import the CSV file data |
The first time we use a function, we will use the :: to indicate which package we are using. Unless we have overlapping function names, this is not necessary, but we will include it here to be informative about where the functions we will use come from.
Context
Limitations
There are some important considerations regarding this data analysis to keep in mind:
Limitation 1
Limitaiton 2
What are the data?
If you want to make a table about variable info:
| variable1 |
Variable info – more details – more detials Example: Content content |
| variable2 |
Variable info – more details – more detials Example: Content content |
Data Import
Put files in docs directory and use here package.
pm <-readr::read_csv(here("docs", "pm25_data.csv"))
Data Exploration and Wrangling
We will also use the %>% pipe which can be used to define the input for later sequential steps. This will make more sense when we have multiple sequential steps using the same data object. To use the pipe notation we need to install and load dplyr as well.
Can add DT tables too- note that you can`t use these inside a click expand details section.
library(DT)
DT::datatable(iris)
Scrollable content:
To make click expand section use:
Click here to see more info
text text
Note!!! You cannot use scroll features inside detail sections unless it is the last header section! Otherwise it will cause the other headers to be missing and other issues.
You can still do this if you leave an open details section like this and then have a section header at the same level as this section:
Click here to see more info
text text
Scrollable content:
Data Visualization
Data Analysis
Summary
Synopsis
Summary Plot
Suggested Homework
LS0tCnRpdGxlOiAiT3BlbiBDYXNlIFN0dWRpZXMgOiBUaXRsZSAiCmNzczogc3R5bGUuY3NzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgc2VsZl9jb250YWluZWQ6IHllcwogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vCiAgICB0aGVtZTogY29zbW8KICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCgotLS0KPHN0eWxlPgojVE9DIHsKICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vb3BlbmNhc2VzdHVkaWVzLmdpdGh1Yi5pby9pbWcvaWNvbi5wbmciKTsKICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47CiAgcGFkZGluZy10b3A6IDI0MHB4ICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQo8L3N0eWxlPgoKCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoaW5jbHVkZSA9IFRSVUUsIGNvbW1lbnQgPSBOQSwgZWNobyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgICAgIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBvdXQud2lkdGggPSAnOTAlJykKbGlicmFyeShoZXJlKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCgojIyMjIHsub3V0bGluZSB9CmBgYHtyLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aCA9ICI4MDAgcHgifQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWciLCAibWFpbnBsb3QucG5nIikpCmBgYAoKIyMjIwoKIyMjIyB7LmRpc2NsYWltZXJfYmxvY2t9CgoqKkRpc2NsYWltZXIqKjogVGhlIHB1cnBvc2Ugb2YgdGhlIFtPcGVuIENhc2UgU3R1ZGllc10oaHR0cHM6Ly9vcGVuY2FzZXN0dWRpZXMuZ2l0aHViLmlvKXt0YXJnZXQ9Il9ibGFuayJ9IHByb2plY3QgaXMgKip0byBkZW1vbnN0cmF0ZSB0aGUgdXNlIG9mIHZhcmlvdXMgZGF0YSBzY2llbmNlIG1ldGhvZHMsIHRvb2xzLCBhbmQgc29mdHdhcmUgaW4gdGhlIGNvbnRleHQgb2YgbWVzc3ksIHJlYWwtd29ybGQgZGF0YSoqLiBBIGdpdmVuIGNhc2Ugc3R1ZHkgZG9lcyBub3QgY292ZXIgYWxsIGFzcGVjdHMgb2YgdGhlIHJlc2VhcmNoIHByb2Nlc3MsIGlzIG5vdCBjbGFpbWluZyB0byBiZSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB3YXkgdG8gYW5hbHl6ZSBhIGdpdmVuIGRhdGEgc2V0LCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjb250ZXh0IG9mIG1ha2luZyBwb2xpY3kgZGVjaXNpb25zIHdpdGhvdXQgZXh0ZXJuYWwgY29uc3VsdGF0aW9uIGZyb20gc2NpZW50aWZpYyBleHBlcnRzLiAKCiMjIyMKCiMjIyMgey5saWNlbnNlX2Jsb2NrfQoKVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwgMy4wIFsoQ0MgQlktTkMgMy4wKV0oaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLzMuMC91cy8pe3RhcmdldD0iX2JsYW5rIn0gIFVuaXRlZCBTdGF0ZXMgTGljZW5zZS4KCiMjIyMKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpUbyBjaXRlIHRoaXMgY2FzZSBzdHVkeSBwbGVhc2UgdXNlOgoKV3JpZ2h0LCBDYXJyaWUgYW5kIE9udGl2ZXJvcywgTWljaGFlbCBhbmQgSmFnZXIsIExlYWggYW5kIFRhdWIsIE1hcmdhcmV0IGFuZCBIaWNrcywgU3RlcGhhbmllLiAoMjAyMCkuIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY2FzZXN0dWRpZXMvb2NzLWJwLWNvMi1lbWlzc2lvbnMuIEV4cGxvcmluZyBDTzIgZW1pc3Npb25zIGFjcm9zcyB0aW1lIChWZXJzaW9uIHYxLjAuMCkuCgojIyMjCgpUbyBhY2Nlc3MgdGhlIEdpdEh1YiByZXBvc2l0b3J5IGZvciB0aGlzIGNhc2Ugc3R1ZHkgc2VlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS8vb3BlbmNhc2VzdHVkaWVzL29jcy1icC1jbzItZW1pc3Npb25zLgpUaGlzIGNhc2Ugc3R1ZHkgaXMgcGFydCBvZiBhIHNlcmllcyBvZiBwdWJsaWMgaGVhbHRoIGNhc2Ugc3R1ZGllcyBmb3IgdGhlIFtCbG9vbWJlcmcgQW1lcmljYW4gSGVhbHRoIEluaXRpYXRpdmVdKGh0dHBzOi8vYW1lcmljYW5oZWFsdGguamh1LmVkdS9vcGVuLWNhc2Utc3R1ZGllcykuCgoKIyAqKk1vdGl2YXRpb24qKgoqKiogCgoKIyMgKipDb250ZW50IEhlYWRlcioqCioqKiAKCkNvbnRlbnQgY29udGVudAoKCiMjIyAqKmNvbnRlbnQgaGVhZGVyIGFkZGl0aW9uYWwgbGV2ZWwqKgoqKioKCj4gQ29udGVudCBmb3IgcXVvdGVzCgoKYGBge3IsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI4MDBweCJ9CmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltZyIsImNvbnRlbnRfaW1hZ2UucG5nIikpCmBgYApmb3IgbGFyZ2UgaW1hZ2VzIGZyb20gdGhlIHdlYi4uLiBtaWdodCBkbyB0aGlzIGluc3RlYWQ6Cgo8cCBhbGlnbj0iY2VudGVyIj4KICA8aW1nIHdpZHRoPSI1MDAiIHNyYz0iaHR0cHM6Ly93d3cuZnJvbnRpZXJzaW4ub3JnL2ZpbGVzL0FydGljbGVzLzUwNTU3MC9mcHViaC0wOC0wMDAxNC1IVE1ML2ltYWdlX20vZnB1YmgtMDgtMDAwMTQtdDAwMi5qcGciPgo8L3A+CgojIyMjIyBbW3NvdXJjZV0oaHR0cHM6Ly93d3cuZnJvbnRpZXJzaW4ub3JnL2FydGljbGVzLzEwLjMzODkvZnB1YmguMjAyMC4wMDAxNC9mdWxsKV0KCjx1PlRvIHVuZGVybGluZSBzb21ldGhpbmc6PC91PiAgCioqQm9sZCoqICAKKkl0YWxpY3MqICAKPHU+Kip1bmRlcmxpbmUgYW5kIGJvbGQqKiA8L3U+ICAKPHU+KioqdW5kZXJsaW5lIGFuZCBib2xkIGFuZCBpdGFsaWNzKioqIDwvdT4gIAoKTGlzdDogIAoxKW1ha2VzdXJlIHRoZXJlIGFyZSB0d28gc3BhY2VzICAgIAoyKWFmdGVyIGVhY2ggaXRlbSB0byBjcmVhdGUgbmV3IGxpbmUgIAoKCiMjIyMgey5yZWZlcmVuY2VfYmxvY2t9CgpZYW5vc2t5LCBKLiBELiBldCBhbC4gU3BhdGlvLXRlbXBvcmFsIG1vZGVsaW5nIG9mIHBhcnRpY3VsYXRlIGFpciBwb2xsdXRpb24gaW4gdGhlIGNvbnRlcm1pbm91cyBVbml0ZWQgU3RhdGVzIHVzaW5nIGdlb2dyYXBoaWMgYW5kIG1ldGVvcm9sb2dpY2FsIHByZWRpY3RvcnMuICpFbnZpcm9uIEhlYWx0aCogMTMsIDYzICgyMDE0KS4KCiMjIyMKCgojICoqTWFpbiBRdWVzdGlvbnMqKgoqKiogCgojIyMjIHsubWFpbl9xdWVzdGlvbl9ibG9ja30KPGI+PHU+IE91ciBtYWluIHF1ZXN0aW9uOiA8L3U+PC9iPgoKMSkgUXVlc3Rpb24gMSAgCjIpIFF1ZXN0aW9uIDIgZXRjLgoKIyMjIwoKIyAqKkxlYXJuaW5nIE9iamVjdGl2ZXMqKiAKKioqIAoKSW4gdGhpcyBjYXNlIHN0dWR5LCB3ZSB3aWxsIGV4cGxvcmUgQ08yIGVtaXNzaW9uIGRhdGEgZnJvbSBhcm91bmQgdGhlIHdvcmxkLiAKV2Ugd2lsbCBhbHNvIGZvY3VzIG9uIHRoZSBVUyBzcGVjaWZpY2FsbHkgdG8gZXZhbHVhdGUgcGF0dGVybnMgb2YgdGVtcGVyYXR1cmVzIGFuZCBuYXR1cmFsIGRpc2FzdGVyIGFjdGl2aXR5LiAKClRoaXMgY2FzZSBzdHVkeSB3aWxsIHBhcnRpY3VsYXJseSBmb2N1cyBvbiBob3cgdG8gdXNlIGRpZmZlcmVudCBkYXRhc2V0cyB0aGF0IHNwYW4gZGlmZmVyZW50IHJhbmdlcyBvZiB0aW1lLCBhcyB3ZWxsIGFzIGhvdyB0byBjcmVhdGUgdmlzdWFsaXphdGlvbnMgb2YgcGF0dGVybnMgb3ZlciB0aW1lLiAKV2Ugd2lsbCBlc3BlY2lhbGx5IGZvY3VzIG9uIHVzaW5nIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMgZnJvbSB0aGUgW2B0aWR5dmVyc2VgXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSwgc3VjaCBhcyBgZHBseXJgLCBgdGlkeXJgLCBhbmQgYGdncGxvdDJgLiAKClRoZSB0aWR5dmVyc2UgaXMgYSBsaWJyYXJ5IG9mIHBhY2thZ2VzIGNyZWF0ZWQgYnkgUlN0dWRpby4gCldoaWxlIHNvbWUgc3R1ZGVudHMgbWF5IGJlIGZhbWlsaWFyIHdpdGggcHJldmlvdXMgUiBwcm9ncmFtbWluZyBwYWNrYWdlcywgdGhlc2UgcGFja2FnZXMgbWFrZSBkYXRhIHNjaWVuY2UgaW4gUiBlc3BlY2lhbGx5IGxlZ2libGUgYW5kIGludHVpdGl2ZS4KClRoZSBza2lsbHMsIG1ldGhvZHMsIGFuZCBjb25jZXB0cyB0aGF0IHN0dWRlbnRzIHdpbGwgYmUgZmFtaWxpYXIgd2l0aCBieSB0aGUgZW5kIG9mIHRoaXMgY2FzZSBzdHVkeSBhcmU6Cgo8dT4qKkRhdGEgU2NpZW5jZSBMZWFybmluZyBPYmplY3RpdmVzOioqPC91PiAgCgoxLiBJbXBvcnRpbmcgZGF0YSBmcm9tIHZhcmlvdXMgdHlwZXMgb2YgRXhjZWwgZmlsZXMgYW5kIENTViBmaWxlcwoyLiBBcHBseSBhY3Rpb24gdmVyYnMgaW4gYGRwbHlyYCBmb3IgZGF0YSB3cmFuZ2xpbmcKMy4gSG93IHRvIHBpdm90IGJldHdlZW4gImxvbmciIGFuZCAid2lkZSIgZGF0YXNldHMKNC4gSm9pbmluZyB0b2dldGhlciBtdWx0aXBsZSBkYXRhc2V0cyB1c2luZyBgZHBseXJgCjUuIEhvdyB0byBjcmVhdGUgZWZmZWN0aXZlIGxvbmdpdHVkaW5hbCBkYXRhIHZpc3VhbGl6YXRpb25zIHdpdGggYGdncGxvdDJgCjYuIEhvdyB0byBhZGQgdGV4dCwgY29sb3IsIGFuZCBsYWJlbHMgdG8gYGdncGxvdDJgIHBsb3RzCjcuIEhvdyB0byBjcmVhdGUgZmFjZXRlZCBgZ2dwbG90MmAgcGxvdHMKCjx1PioqU3RhdGlzdGljYWwgTGVhcm5pbmcgT2JqZWN0aXZlczoqKjwvdT4gIAoKMS4gSW50cm9kdWN0aW9uIHRvIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGFzIGEgc3VtbWFyeSBzdGF0aXN0aWMKMi4gUmVsYXRpb25zaGlwIGJldHdlZW4gY29ycmVsYXRpb24gYW5kIGxpbmVhciByZWdyZXNzaW9uCjMuIENvcnJlbGF0aW9uIGlzIG5vdCBjYXVzYXRpb24KCmBgYHtyLCBvdXQud2lkdGggPSAiMjAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0KaW5jbHVkZV9ncmFwaGljcygiaHR0cHM6Ly90aWR5dmVyc2UudGlkeXZlcnNlLm9yZy9sb2dvLnBuZyIpCmBgYAoKCioqKiAKCgpXZSB3aWxsIGJlZ2luIGJ5IGxvYWRpbmcgdGhlIHBhY2thZ2VzIHRoYXQgd2Ugd2lsbCBuZWVkOgoKYGBge3J9CmxpYnJhcnkoaGVyZSkKbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKYGBgCgoKIFBhY2thZ2UgICB8IFVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQpbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2plbm55YmMvaGVyZV9oZXJlKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgIHwgdG8gZWFzaWx5IGxvYWQgYW5kIHNhdmUgZGF0YQpbcmVhZHJdKGh0dHBzOi8vcmVhZHIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGltcG9ydCB0aGUgQ1NWIGZpbGUgZGF0YQoKClRoZSBmaXJzdCB0aW1lIHdlIHVzZSBhIGZ1bmN0aW9uLCB3ZSB3aWxsIHVzZSB0aGUgYDo6YCB0byBpbmRpY2F0ZSB3aGljaCBwYWNrYWdlIHdlIGFyZSB1c2luZy4gVW5sZXNzIHdlIGhhdmUgb3ZlcmxhcHBpbmcgZnVuY3Rpb24gbmFtZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IHdlIHdpbGwgaW5jbHVkZSBpdCBoZXJlIHRvIGJlIGluZm9ybWF0aXZlIGFib3V0IHdoZXJlIHRoZSBmdW5jdGlvbnMgd2Ugd2lsbCB1c2UgY29tZSBmcm9tLgoKCiMgKipDb250ZXh0KioKKioqIAoKIyAqKkxpbWl0YXRpb25zKioKKioqIApUaGVyZSBhcmUgc29tZSBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbnMgcmVnYXJkaW5nIHRoaXMgZGF0YSBhbmFseXNpcyB0byBrZWVwIGluIG1pbmQ6IAoKMSkgTGltaXRhdGlvbiAxICAKCjIpIExpbWl0YWl0b24gMiAgCgoKIyAqKldoYXQgYXJlIHRoZSBkYXRhPyoqCioqKiAKCklmIHlvdSB3YW50IHRvIG1ha2UgYSB0YWJsZSBhYm91dCB2YXJpYWJsZSBpbmZvOgoKVmFyaWFibGUgICB8IERldGFpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQoqKnZhcmlhYmxlMSoqICB8IFZhcmlhYmxlIGluZm8gIDxicj4gLS0gbW9yZSBkZXRhaWxzIDxicj4gLS0gbW9yZSBkZXRpYWxzIDxicj4gICoqRXhhbXBsZSoqOiBDb250ZW50IGNvbnRlbnQgIAoqKnZhcmlhYmxlMioqICB8IFZhcmlhYmxlIGluZm8gIDxicj4gLS0gbW9yZSBkZXRhaWxzIDxicj4gLS0gbW9yZSBkZXRpYWxzIDxicj4gICoqRXhhbXBsZSoqOiBDb250ZW50IGNvbnRlbnQKCiMgKipEYXRhIEltcG9ydCoqCioqKiAKClB1dCBmaWxlcyBpbiBkb2NzIGRpcmVjdG9yeSBhbmQgdXNlIGBoZXJlYCBwYWNrYWdlLgoKYGBge3J9CnBtIDwtcmVhZHI6OnJlYWRfY3N2KGhlcmUoImRvY3MiLCAicG0yNV9kYXRhLmNzdiIpKQpgYGAKCiMgKipEYXRhIEV4cGxvcmF0aW9uIGFuZCBXcmFuZ2xpbmcqKgoqKiogCgpXZSB3aWxsIGFsc28gdXNlIHRoZSBgJT4lYCBwaXBlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgaW5wdXQgZm9yIGxhdGVyIHNlcXVlbnRpYWwgc3RlcHMuIFRoaXMgd2lsbCBtYWtlIG1vcmUgc2Vuc2Ugd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHNlcXVlbnRpYWwgc3RlcHMgdXNpbmcgdGhlIHNhbWUgZGF0YSBvYmplY3QuIFRvIHVzZSB0aGUgcGlwZSBub3RhdGlvbiB3ZSBuZWVkIHRvIGluc3RhbGwgYW5kIGxvYWQgZHBseXIgYXMgd2VsbC4KCkNhbiBhZGQgRFQgdGFibGVzIHRvby0gbm90ZSB0aGF0IHlvdSBjYW5gdCB1c2UgdGhlc2UgaW5zaWRlIGEgY2xpY2sgZXhwYW5kIGRldGFpbHMgc2VjdGlvbi4KCmBgYHtyfQpsaWJyYXJ5KERUKQpEVDo6ZGF0YXRhYmxlKGlyaXMpCmBgYAoKU2Nyb2xsYWJsZSBjb250ZW50OgoKIyMjIyB7LnNjcm9sbGFibGUgfQpgYGB7cn0KIyBTY3JvbGwgdGhyb3VnaCB0aGUgb3V0cHV0IQpwbSAlPiUgCiAgZGlzdGluY3Qoc3RhdGUpICU+JQogIHByaW50KG4gPSAxZTMpCmBgYAojIyMjCgoKVG8gbWFrZSBjbGljayBleHBhbmQgc2VjdGlvbiB1c2U6Cgo8ZGV0YWlscz48c3VtbWFyeT4gQ2xpY2sgaGVyZSB0byBzZWUgbW9yZSBpbmZvIDwvc3VtbWFyeT4KCnRleHQgdGV4dAoKPC9kZXRhaWxzPgoKTm90ZSEhISBZb3UgY2Fubm90IHVzZSBzY3JvbGwgZmVhdHVyZXMgaW5zaWRlIGRldGFpbCBzZWN0aW9ucyB1bmxlc3MgaXQgaXMgdGhlIGxhc3QgaGVhZGVyIHNlY3Rpb24hIE90aGVyd2lzZSBpdCB3aWxsIGNhdXNlIHRoZSBvdGhlciBoZWFkZXJzIHRvIGJlIG1pc3NpbmcgYW5kIG90aGVyIGlzc3Vlcy4gCgpZb3UgY2FuIHN0aWxsIGRvIHRoaXMgaWYgeW91IGxlYXZlIGFuIG9wZW4gZGV0YWlscyBzZWN0aW9uIGxpa2UgdGhpcyBhbmQgdGhlbiBoYXZlIGEgc2VjdGlvbiBoZWFkZXIgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhpcyBzZWN0aW9uOgoKPGRldGFpbHM+PHN1bW1hcnk+IENsaWNrIGhlcmUgdG8gc2VlIG1vcmUgaW5mbyA8L3N1bW1hcnk+Cgp0ZXh0IHRleHQKClNjcm9sbGFibGUgY29udGVudDoKCiMjIyMgey5zY3JvbGxhYmxlIH0KYGBge3J9CiMgU2Nyb2xsIHRocm91Z2ggdGhlIG91dHB1dCEKcG0gJT4lIAogIGRpc3RpbmN0KHN0YXRlKSAlPiUKICBwcmludChuID0gMWUzKQpgYGAKIyMjIwoKCiMgKipEYXRhIFZpc3VhbGl6YXRpb24qKgoqKiogCgoKIyAqKkRhdGEgQW5hbHlzaXMqKgoqKiogCgojIyAqKmNvbnRlbnQgaGVhZGVyKioKKioqIAojIyMgKipjb250ZW50IGhlYWRlciBhZGRpdGlvbmFsIGxldmVsKioKKioqCgoKIyAqKlN1bW1hcnkqKgoqKiogCgojIyAqKlN5bm9wc2lzKioKKioqCiMjICoqU3VtbWFyeSBQbG90KioKKioqCgojIyAqKlN1Z2dlc3RlZCBIb21ld29yayoqCioqKiAKCgojICoqQWRkaXRpb25hbCBJbmZvcm1hdGlvbioqCioqKgoKIyMgKioKCiMjICoqSGVscGZ1bCBMaW5rcyoqCioqKiAKCnJldmlldyBvZiBbdGlkeW1vZGVsc10oaHR0cHM6Ly9ydmlld3MucnN0dWRpby5jb20vMjAxOS8wNi8xOS9hLWdlbnRsZS1pbnRyby10by10aWR5bW9kZWxzLyl7dGFyZ2V0PSJfYmxhbmsifSAKCmd1aWRlIGZvciBbcHJlcHJvY2Vzc2luZyB3aXRoIHJlY2lwZXNdKGh0dHA6Ly93d3cucmViZWNjYWJhcnRlci5jb20vYmxvZy8yMDE5LTA2LTA2X3ByZV9wcm9jZXNzaW5nLykKCltndWlkZV0oaHR0cHM6Ly9icmlhdHRlLmdpdGh1Yi5pby9nZ2NvcnIvKSBmb3IgdXNpbmcgR0dhbGx5IHRvIGNyZWF0ZSBjb3JyZWxhdGlvbiBwbG90cwpbZ3VpZGVdKGh0dHBzOi8vd3d3LnRpZHl2ZXJzZS5vcmcvYmxvZy8yMDE4LzExL3BhcnNuaXAtMC0wLTEvKSBmb3IgdXNpbmcgcGFyc25pcCB0byB0cnkgZGlmZmVyZW50IGFsZ29yaXRobXMgb3IgZW5naW5lcwpbcmVjaXBlIGZ1bmN0aW9uc10oaHR0cHM6Ly90aWR5bW9kZWxzLmdpdGh1Yi5pby9yZWNpcGVzL3JlZmVyZW5jZS9pbmRleC5odG1sKQoKPHU+VGVybXMgYW5kIGNvbmNlcHRzIGNvdmVyZWQ6PC91PiAgCgpbVGlkeXZlcnNlXShodHRwczovL3d3dy50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgCltSU3R1ZGlvIGNoZWF0c2hlZXRzXShodHRwczovL3JzdHVkaW8uY29tL3Jlc291cmNlcy9jaGVhdHNoZWV0cy8pe3RhcmdldD0iX2JsYW5rIn0gIApbSW5mZXJlbmNlXShodHRwczovL3d3dy5icml0YW5uaWNhLmNvbS9zY2llbmNlL2luZmVyZW5jZS1zdGF0aXN0aWNzKXt0YXJnZXQ9Il9ibGFuayJ9ICAKW1JlZ3Jlc3Npb25dKGh0dHBzOi8vbGluZGVsb2V2LmdpdGh1Yi5pby90ZXN0cy1hcy1saW5lYXIvKXt0YXJnZXQ9Il9ibGFuayJ9ICAKW0RpZmZlcmVudCB0eXBlcyBvZiByZWdyZXNzaW9uXShodHRwczovL3d3dy5hbmFseXRpY3N2aWRoeWEuY29tL2Jsb2cvMjAxNS8wOC9jb21wcmVoZW5zaXZlLWd1aWRlLXJlZ3Jlc3Npb24vKXt0YXJnZXQ9Il9ibGFuayJ9ICAKW09yZGluYXJ5IGxlYXN0IHNxdWFyZXMgbWV0aG9kXShodHRwOi8vc2V0b3NhLmlvL2V2L29yZGluYXJ5LWxlYXN0LXNxdWFyZXMtcmVncmVzc2lvbi8pe3RhcmdldD0iX2JsYW5rIn0gIApbUmVzaWR1YWxdKGh0dHBzOi8vd3d3LnN0YXRpc3RpY3Nob3d0by5kYXRhc2NpZW5jZWNlbnRyYWwuY29tL3Jlc2lkdWFsLyl7dGFyZ2V0PSJfYmxhbmsifSAgCgo8dT5QYWNrYWdlcyB1c2VkIGluIHRoaXMgY2FzZSBzdHVkeTogPC91PgoKIFBhY2thZ2UgICB8IFVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLQpbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2plbm55YmMvaGVyZV9oZXJlKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgIHwgdG8gZWFzaWx5IGxvYWQgYW5kIHNhdmUgZGF0YSAgCltyZWFkcl0oaHR0cHM6Ly9yZWFkci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gaW1wb3J0IHRoZSBDU1YgZmlsZSBkYXRhICAKW2RwbHlyXShodHRwczovL2RwbHlyLnRpZHl2ZXJzZS5vcmcvKXt0YXJnZXQ9Il9ibGFuayJ9ICAgICAgfCB0byBhcnJhbmdlL2ZpbHRlci9zZWxlY3QvY29tcGFyZSBzcGVjaWZpYyBzdWJzZXRzIG9mIHRoZSBkYXRhICAKW3NraW1yXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvc2tpbXIvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gZ2V0IGFuIG92ZXJ2aWV3IG9mIGRhdGEgICAKW3N1bW1hcnl0b29sc10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3NraW1yL2luZGV4Lmh0bWwpe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIGdldCBhbiBvdmVydmlldyBvZiBkYXRhIGluIGEgZGlmZmVyZW50IHN0eWxlICAgCltwZGZ0b29sc10oaHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvd2ViL3BhY2thZ2VzL3BkZnRvb2xzL3BkZnRvb2xzLnBkZil7dGFyZ2V0PSJfYmxhbmsifSAgIHwgdG8gcmVhZCBhIFBERiBpbnRvIFIgICAKW21hZ3JpdHRyXShodHRwczovL21hZ3JpdHRyLnRpZHl2ZXJzZS5vcmcvYXJ0aWNsZXMvbWFncml0dHIuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSAgIHwgdG8gdXNlIHRoZSBgJTw+JWAgcGlwcGluZyBvcGVyYXRvciAgCltwdXJycl0oaHR0cHM6Ly9wdXJyci50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICAgIHwgdG8gcGVyZm9ybSBmdW5jdGlvbnMgb24gYWxsIGNvbHVtbnMgb2YgYSB0aWJibGUgICAKW3RpYmJsZV0oaHR0cHM6Ly90aWJibGUudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgIHwgdG8gY3JlYXRlIGRhdGEgb2JqZWN0cyB0aGF0IHdlIGNhbiBtYW5pcHVsYXRlIHdpdGggIGRwbHlyL3N0cmluZ3IvdGlkeXIvcHVycnIgIApbdGlkeXJdKGh0dHBzOi8vdGlkeXIudGlkeXZlcnNlLm9yZy8pe3RhcmdldD0iX2JsYW5rIn0gICAgICB8IHRvIHNlcGFyYXRlIGRhdGEgd2l0aGluIGEgY29sdW1uIGludG8gbXVsdGlwbGUgY29sdW1ucyAKW2dncGxvdDJdKGh0dHBzOi8vZ2dwbG90Mi50aWR5dmVyc2Uub3JnLyl7dGFyZ2V0PSJfYmxhbmsifSAgICB8IHRvIG1ha2UgdmlzdWFsaXphdGlvbnMgd2l0aCBtdWx0aXBsZSBsYXllcnMgIAoKIyMgKipTZXNzaW9uIEluZm8qKgoqKioKCiMjICoqQWNrbm93bGVkZ21lbnRzKioKKioq